﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BorisTheBlade
{
	/// <summary>
	/// Общий интерфейс подключений
	/// </summary>
	interface IConnection
	{

		#region Данные_Подключения

		/// <summary>
		/// Аккаунт
		/// </summary>
		string Account { get; }

		/// <summary>
		/// Сслыка счета
		/// </summary>
		string BrokerRef { get;}

		/// <summary>
		/// Тип сервера
		/// </summary>
		string ServerType { get;}

		/// <summary>
		/// Идентификатор подлючения
		/// </summary>
		string ConnectionID { get; }

		/// <summary>
		/// Адрес сервера
		/// </summary>
		string Server { get; }

		/// <summary>
		/// Логин
		/// </summary>
		string Login { get ; }

		/// <summary>
		/// Пароль
		/// </summary>
		string Password { get ; }

		/// <summary>
		/// Порт
		/// </summary>
		string Port { get; }

		#endregion Данные_Подключения

		#region Мастер_Финансовых_Инструментов
		
		/// <summary>
		/// Список объектов, типа [Финансовый инструмент]
		/// </summary>
		List<ISecurity> Securities { get; set; }

		#endregion Мастер_Финансовых_Инструментов

		#region Таблицы

		/// <summary>
		/// Таблица Финанасовых Инструментов
		/// </summary>
		List<WrapperSecurities> WSerurities { get; set; }

		/// <summary>
		/// Таблица Индексов
		/// </summary>
		List<WrapperIndexes> WIndexes { get; set; }

		/// <summary>
		/// Таблица Новостей
		/// </summary>
		List<WrapperNews> WNews { get; set; }

		/// <summary>
		/// Таблица Заявок
		/// </summary>
		List<WrapperOrders> WOrders { get; set; }

		/// <summary>
		/// Таблица Стаканов
		/// </summary>
		List<WrapperOrderbook> WOrderbook { get; set; }

		/// <summary>
		/// Таблица Позиций по деньгам
		/// </summary>
		List<WrapperPositions> WPositions { get; set; }

		/// <summary>
		/// Таблица Стоп-Заявок
		/// </summary>
		List<WrapperStopOrders> WStopOrders { get; set; }

		/// <summary>
		/// Таблица Сделок
		/// </summary>
		List<WrapperTrades> WTrades { get; set; }

		/// <summary>
		/// Таблица Счетов
		/// </summary>
		List<WrapperTrdAcc> WtrdAcc { get; set; }

		/// <summary>
		/// Таблица Позиций по бумагам
		/// </summary>
		List<WrapperFirm_Holding_Total> WFirm_Holding_Total { get; set; }

		/// <summary>
		/// Таблица Истории котировок (минутки)
		/// </summary>
		List<WrapperHistory> WHistory { get; set; }

		/// <summary>
		/// Таблица Истории котировок (дневки)
		/// </summary>
		List<WrapperHistory_Daily> WHistoryDaily { get; set; }

		/// <summary>
		/// Таблица Режимов торгов
		/// </summary>
		List<WrapperBoards> WBoards { get; set; }

		/// <summary>
		/// Таблица Системного времени
		/// </summary>
		List<WrapperTesystime> WTesystime { get; set; }

		/// <summary>
		/// Таблица Всех сделок
		/// </summary>
		List<WrapperAll_Trades> WAllTrades { get; set; }

	#endregion Таблицы

		#region Методы

		/// <summary>
		/// Подсоединиться
		/// </summary>
		void Connect();

		/// <summary>
		/// Отсоединиться
		/// </summary>
		void Disconnect();

		/// <summary>
		/// Открытие таблицы
		/// </summary>
		/// <param name="tableName">Имя таблицы из перечисления</param>
		/// <param name="tableFields">Поля таблицы</param>
		/// <param name="tableFilter">Фильтр таблицы</param>
		void OpenTable(WrapperEnums.AllTables tableName, string tableFields, string tableFilter);
		/// <summary>
		/// Открытие таблицы
		/// </summary>
		/// <param name="tableName">Имя таблицы из перечисления</param>
		/// <param name="secBoard">Код режима торгов</param>
		/// <param name="secCode">Код финансового инстумента</param>
		/// <param name="tableFields">Поля таблицы</param>
		/// <param name="tableFilter">Фильтр таблицы</param>
		void OpenTable(WrapperEnums.AllTables tableName, string secBoard, string secCode, string tableFields, string tableFilter);

		#region Работа_с_заявками
		/// <summary>
		/// Добавление ордера
		/// </summary>
		/// <param name="buySell">Направление операции: "B" – покупка, "S" – продажа.</param>
		/// <param name="mktLimit">Тип заявки: "M" – рыночная, "L" – лимитированная.</param>
		/// <param name="splitFlag">Признак расщепления цены: "S" – по разным ценам, "O" – по одной цене.</param>
		/// <param name="immCancel">Условие исполнения: " " (пробел) – поставить в очередь, "N" – немедленно или отклонить, "W" – снять остаток.</param>
		/// <param name="entryType">Тип ввода значения цены: "P" – цена, "Y" – доходность, "W" – средневзвешенная цена.</param>
		/// <param name="marketMaker">Признак заявки Маркет-Мейкера: " " (пробел) – обычная заявка, "M" – заявка Маркет-Мейкера.</param>
		/// <param name="secBoard">Код режима торгов для финансового инструмента.</param>
		/// <param name="secCode">Код финансового инструмента.</param>
		/// <param name="issueCode">Код выпуска ценной бумаги.</param>
		/// <param name="price">Цена за одну ценную бумагу.</param>
		/// <param name="amount">Количество ценных бумаг, выраженное в лотах.</param>
		/// <param name="extRef">Внешняя ссылка.</param>
		/// <param name="orderNo">Cодержит номер зарегистрированной заявки</param>
		/// <param name="resultMsg">Cодержит текстовое сообщение о результате операции</param>
		int AddOrder(string buySell, string mktLimit, string splitFlag, string immCancel, string entryType, string marketMaker, string secBoard, string secCode, string issueCode, double price, int amount, string extRef, out long orderNo, out string resultMsg);

		/// <summary>
		/// Сдвиг одной или двух ранее введенных заявок по их номерам.
		/// </summary>
		/// <param name="mode">Режим выполнения операции. 0 - Оставить количества в заявках, какие стоят; 1 - Изменить количества в заявках на присланные; 2 - При несовпадении присланных количеств с текущим хотя бы в одной заявке – обе их только снять (и не ставить). </param>
		/// <param name="orderNo1">Номер первой удаляемой заявки.</param>
		/// <param name="price1">Новая цена для первой заявки.</param>
		/// <param name="amount1">Новое количество единиц инструмента для первой заявки.</param>
		/// <param name="extRef1">Новая внешняя ссылка для первой заявки.</param>
		/// <param name="orderNo2">Номер второй удаляемой заявки.</param>
		/// <param name="price2">Новая цена для второй заявки.</param>
		/// <param name="amount2">Новое количество единиц инструмента для второй заявки.</param>
		/// <param name="extRef2">Новая внешняя ссылка для второй заявки.</param>
		/// <param name="newOrderNo1">Номер сдвинутой заявки 1.</param>
		/// <param name="newOrderNo2">Номер сдвинутой заявки 2.</param>
		/// <param name="resultMsg">Содержит текстовое сообщение о результате операции.</param>
		int MoveOrder(int mode, long orderNo1, double price1, int amount1, string extRef1, long orderNo2, double price2, int amount2, string extRef2, out long newOrderNo1, out long newOrderNo2, string resultMsg);

		/// <summary>
		/// Удаление ордера
		/// </summary>
		/// <param name="ordNo">Номер удаляемой заявки</param>
		bool DelOrder(long ordNo, out int m_LastDelResult, out int m_LastWithdrawedAmount);
		
		#endregion Работа_с_заявками
		
		#endregion Методы

		#region События_подключения

		/// <summary>
		/// Событие - Соединение установлено
		/// </summary>
		event EventHandler Connected;

		/// <summary>
		/// Событие - Репликация таблицы завершена
		/// </summary>
		event EventHandler TableReplied;

		#endregion События_подключения

	}
}
